﻿#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//struct Goods
//{
//	string _name; //名字
//	double _price; // 价格
//	int _evaluate; // 评价
//	Goods(const char* str, double price, int evaluate)
//		:_name(str)
//		, _price(price)
//		, _evaluate(evaluate)
//	{}
//};
//struct ComparePriceLess
//{
//	bool operator()(const Goods& gl, const Goods& gr)
//	{
//		return gl._price < gr._price;
//	}
//};
//struct ComparePriceGreater
//{
//	bool operator()(const Goods& gl, const Goods& gr)
//	{
//		return gl._price > gr._price;
//	}
//};
//
//int main()
//{
//	vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,
//	  3 }, { "菠萝", 1.5, 4 } };
//	sort(v.begin(), v.end(), [](Goods& a, Goods& b) {return a._price < b._price; });
//	sort(v.begin(), v.end(), [](Goods& a, Goods& b) {return a._price > b._price; });
//	return 0;
//}
//int main()
//{
//	vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,
//   3 }, { "菠萝", 1.5, 4 } };
//	sort(v.begin(), v.end(), ComparePriceLess());
//	sort(v.begin(), v.end(), ComparePriceGreater());
//}

//int main()
//{
//	// 最简单的lambda表达式, 该lambda表达式没有任何意义
//	[] {};
//
//	// 省略参数列表和返回值类型，返回值类型由编译器推导为int
//	int a = 3, b = 4;
//	[=] {return a + 3; };
//
//	// 省略了返回值类型，无返回值类型
//	auto fun1 = [&](int c) {b = a + c; };
//	fun1(10);
//	cout<< a << " " << b << endl;
//
//	// 各部分都很完善的lambda函数
//	auto fun2 = [=, &b](int c)->int {return b += a + c; };
//	cout << fun2(10) << endl;
//
//	// 复制捕捉x
//	int x = 10;
//	auto add_x = [x](int a) mutable { x *= 2; return a + x; };
//	cout << add_x(10) << endl;
//	return 0;
//}

//void (*PF)();
//int main()
//{
//	auto f1 = [] {cout << "hello world" << endl; };
//	auto f2 = [] {cout << "hello world" << endl; };
//	// 此处先不解释原因，等lambda表达式底层实现原理看完后，大家就清楚了
//    //f1 = f2;   // 编译失败--->提示找不到operator=()
//	// 允许使用一个lambda表达式拷贝构造一个新的副本
//	auto f3(f2);
//	f3();
//	// 可以将lambda表达式赋值给相同类型的函数指针
//	PF = f2;
//	PF();
//	return 0;
//}

//// 递归终止函数
//template <class T>
//void ShowList(const T& t)
//{
//	cout << t << endl;
//}
//// 展开函数
//template <class T, class ...Args>
//void ShowList(T value, Args... args)
//{
//	cout << value << " ";
//	ShowList(args...);
//}
//int main()
//{
//	ShowList(1);
//	ShowList(1, 'A');
//	ShowList(1, 'A', std::string("sort"));
//	return 0;
//}

//#include <iostream>
//
//// 递归终止函数
//void print() {
//    std::cout << std::endl;
//}
//
//template<typename T, typename... Args>
//void print(const T& first, const Args&... args) {
//    std::cout << first << " ";
//    print(args...);
//}
//
//int main() {
//    print(1, 2.5, "Hello", 'a');
//    return 0;
//}

// 使用举例
//#include <functional>
//int Plus(int a, int b)
//{
//	return a + b;
//}
//class Sub
//{
//public:
//	int sub(int a, int b)
//	{
//		return a - b;
//	}
//};
//int main()
//{
//	//表示绑定函数plus 参数分别由调用 func1 的第一，二个参数指定
//	std::function<int(int, int)> func1 = std::bind(Plus, placeholders::_1,
//		placeholders::_2);
//	//auto func1 = std::bind(Plus, placeholders::_1, placeholders::_2);
//	//func2的类型为 function<void(int, int, int)> 与func1类型一样
//	//表示绑定函数 plus 的第一，二为： 1， 2
//	auto func2 = std::bind(Plus, 1, 2);
//	cout << func1(1, 2) << endl;
//	cout << func2() << endl;
//	Sub s;
//	// 绑定成员函数
//	std::function<int(int, int)> func3 = std::bind(&Sub::sub, s,
//		placeholders::_1, placeholders::_2);
//	// 参数调换顺序
//	std::function<int(int, int)> func4 = std::bind(&Sub::sub, s,
//		placeholders::_2, placeholders::_1);
//	cout << func3(1, 2) << endl;
//	cout << func4(1, 2) << endl;
//	return 0;
//}

//#include <iostream>
//#include <functional>
//
//// 目标函数
//void greet(const std::string& name, int age) {
//    std::cout << "Hello, " << name << "! You are " << age << " years old." << std::endl;
//}
//
//int main() {
//    // 使用 std::bind 绑定目标函数和部分参数
//    auto greetSomeone = std::bind(greet, "Alice", std::placeholders::_2);  //指定
//
//    // 调用绑定后的函数对象，并传递剩余的参数
//    greetSomeone(0,30);
//
//    return 0;
//}


//class CopyBan
//{
//public:
//	CopyBan()
//	{
//
//	}
//
//private:
//	CopyBan(const CopyBan&);
//	CopyBan& operator=(const CopyBan&);
//	//...
//};

//class CopyBan
//{
//public:
//	CopyBan()
//	{
//	
//	}
//
//	CopyBan(const CopyBan&) = delete;
//	CopyBan& operator=(const CopyBan&) = delete;
//	//...
//};
//int main()
//{
//	CopyBan c;
//	CopyBan s(c);
//	CopyBan s=c;
//	return 0;
//}

////思路一,封析构函数
//class HeapOnly
//{
//public:
//	void destory()
//	{
//		delete this;
//	}
//private:
//	~HeapOnly()
//	{
//		cout << "调用析构成功!" << endl;
//	}
//};
//
//class HeapOnly {
//private:
//    // 私有构造函数和析构函数，防止在栈上创建对象
//    HeapOnly() {}
//    ~HeapOnly() {}
//
//public:
//    // 静态成员函数用于返回堆上分配的对象指针
//    static HeapOnly* createObject() {
//        return new HeapOnly();
//    }
//};
//
//int main()
//{
//    HeapOnly* h = HeapOnly::createObject();
//    HeapOnly s(h);
//	return 0;
//}

// 饿汉模式
// 优点：简单
// 缺点：可能会导致进程启动慢，且如果有多个单例类对象实例启动顺序不确定。
class Singleton
{
public:
	static Singleton* GetInstance()
	{
		return &m_instance;
	}
private:
	// 构造函数私有
	Singleton() {};

	// C++98 防拷贝
	Singleton(Singleton const&);
	Singleton& operator=(Singleton const&);

	// or

	// C++11
	Singleton(Singleton const&) = delete;
	Singleton& operator=(Singleton const&) = delete;

	static Singleton m_instance;
};
Singleton  Singleton::m_instance;

int main()
{

	return 0;
}